# entities/Stickman.py
# 火柴人实体类 - 完善版本
# 包含位置、速度、状态和碰撞检测支持

from config import (
    STICKMAN_INIT_X,
    STICKMAN_INIT_Y,
    MOVE_SPEED,
    JUMP_POWER,
    GROUND_Y, PLATFORMS,
)


class Stickman:
    """
    火柴人角色类（简化数据结构，便于初学者理解）

    属性：
        x, y: 当前位置（头的中心）
        vx, vy: 水平和垂直速度
        speed: 左右移动速度
        jump_power: 跳跃初速度
        on_ground: 是否站在平台上（决定能否跳跃）
        alive: 是否存活（是否掉落过远）
        rect: 碰撞矩形 [left, top, width, height]，用于检测
    """

    def __init__(self):
        # --- 位置与速度 ---
        self.x = STICKMAN_INIT_X          # 初始 x 坐标
        self.y = STICKMAN_INIT_Y          # 初始 y 坐标
        self.vx = 0                       # 水平速度
        self.vy = 0                       # 垂直速度（受重力影响）

        # --- 控制参数 ---
        self.speed = MOVE_SPEED           # 左右移动速度大小
        self.jump_power = JUMP_POWER      # 跳跃初速度（负值向上）

        # --- 状态标记 ---
        self.on_ground = True            # 是否接触平台
        self.alive = True                 # 是否存活（未掉落）

        # --- 碰撞检测用矩形 ---
        # rect = [left, top, width, height]
        # 初始大小：宽20，高40（包含头和身体）
        self.width = 20
        self.height = 40
        self.update_rect()  # 初始化 rect

    def update_rect(self):
        """
        更新火柴人的碰撞矩形位置
        在每次位置变化后调用
        """
        self.rect = [
            self.x - self.width // 2,   # 左边
            self.y - self.height,       # 上边（头在上，脚在下）
            self.width,
            self.height
        ]

    def is_out_of_bounds(self, ground_y):
        """
        判断是否掉落过低（游戏失败条件之一）
        :param ground_y: 允许的最低 Y 值
        :return: 是否越界
        """
        return self.y > ground_y